using System;

namespace Think.Problems
{
    public interface IDeck
    {
        /// <summary>
        /// Value of cards in this deck.
        /// </summary>
        int Count { get; }

        /// <summary>
        /// Draw one card from this deck.
        /// </summary>
        /// <returns>Card code.</returns>
        string Draw();

        /// <summary>
        /// Draw the given number of cards from the deck (<paramref name="a_count"/>).
        /// </summary>
        /// <param name="a_count">Number of cards.</param>
        /// <returns>Cards drawn.</returns>
        String[] Draw(int a_count);

        /// <summary>
        /// Return the given cards (<paramref name="a_cards"/>) to the bottom of this deck if it is a valid card and 
        ///     does not already exist in this deck.
        /// </summary>
        /// <param name="a_cards">Cards to return.</param>
        /// <exception cref="ArgumentNullException">Thrown if "<paramref name="a_cards"/>" is null.</exception>
        void ReturnToBottom(params string[] a_cards);

        /// <summary>
        /// Add the given card (<paramref name="a_card"/>) to the bottom of this deck if it is a valid card and does
        ///     not already exist in this deck.
        /// </summary>
        /// <param name="a_card"></param>
        void ReturnToBottom(string a_card);
    }
}